package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.dto.chat.YunkeCheckUserInfoDto;
import com.yunke.dto.chat.YunkeSendMessageDto;
import com.yunke.entity.YunkeUserChat;
import com.yunke.vo.chat.YunkeChatVo;
import com.yunke.vo.chat.YunkeMessageVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 聊天通讯Service接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeChatService extends IService<YunkeUserChat> {

    /**
     * 获取聊天列表
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @return 聊天列表
     */
    Page<YunkeChatVo> getChatList(Long current, Long size);

    /**
     * 获取聊天记录
     * 
     * @param chatId 聊天室ID
     * @param current 当前页码
     * @param size 每页大小
     * @return 聊天记录
     */
    Page<YunkeMessageVo> getChatHistory(String chatId, Long current, Long size);

    /**
     * 发送消息
     * 
     * @param sendMessageDto 发送消息DTO
     * @return 消息信息
     */
    YunkeMessageVo sendMessage(YunkeSendMessageDto sendMessageDto);

    /**
     * 发送图片消息
     * 
     * @param receiverId 接收者用户ID
     * @param imageFile 图片文件
     * @param replyMessageId 回复的消息ID
     * @return 消息信息
     */
    YunkeMessageVo sendImageMessage(Long receiverId, MultipartFile imageFile, String replyMessageId);

    /**
     * 发送语音消息
     * 
     * @param receiverId 接收者用户ID
     * @param voiceFile 语音文件
     * @param duration 语音时长
     * @param replyMessageId 回复的消息ID
     * @return 消息信息
     */
    YunkeMessageVo sendVoiceMessage(Long receiverId, MultipartFile voiceFile, Integer duration, String replyMessageId);

    /**
     * 发送位置消息
     * 
     * @param receiverId 接收者用户ID
     * @param longitude 经度
     * @param latitude 纬度
     * @param address 地址
     * @param replyMessageId 回复的消息ID
     * @return 消息信息
     */
    YunkeMessageVo sendLocationMessage(Long receiverId, Double longitude, Double latitude, String address, String replyMessageId);

    /**
     * 标记消息已读
     * 
     * @param chatId 聊天室ID
     * @param messageIds 消息ID列表
     * @return 操作结果
     */
    boolean markMessagesAsRead(String chatId, List<String> messageIds);

    /**
     * 删除聊天记录
     * 
     * @param chatId 聊天室ID
     * @param deleteType 删除类型：1-删除单条消息 2-清空聊天记录
     * @param messageIds 消息ID列表（删除单条消息时需要）
     * @return 操作结果
     */
    boolean deleteChatRecord(String chatId, Integer deleteType, List<String> messageIds);

    /**
     * 设置聊天置顶
     * 
     * @param chatId 聊天室ID
     * @param isTop 是否置顶
     * @return 操作结果
     */
    boolean setChatTop(String chatId, Boolean isTop);

    /**
     * 设置消息免打扰
     * 
     * @param chatId 聊天室ID
     * @param isMute 是否免打扰
     * @return 操作结果
     */
    boolean setChatMute(String chatId, Boolean isMute);

    /**
     * 查看用户信息申请
     * 
     * @param checkUserInfoDto 查看用户信息申请DTO
     * @return 申请结果
     */
    Map<String, Object> checkUserInfoApply(YunkeCheckUserInfoDto checkUserInfoDto);

    /**
     * 获取未读消息数
     * 
     * @return 未读消息统计
     */
    Map<String, Object> getUnreadCount();

    /**
     * 搜索聊天记录
     * 
     * @param chatId 聊天室ID
     * @param keyword 搜索关键词
     * @param messageType 消息类型筛选
     * @param current 当前页码
     * @param size 每页大小
     * @return 搜索结果
     */
    Page<YunkeMessageVo> searchChatHistory(String chatId, String keyword, Integer messageType, Long current, Long size);

    /**
     * 撤回消息
     * 
     * @param messageId 消息ID
     * @param reason 撤回原因
     * @return 操作结果
     */
    boolean recallMessage(String messageId, String reason);

    /**
     * 建立WebSocket连接（注册在线状态）
     * 
     * @param userId 用户ID
     * @param sessionId WebSocket会话ID
     * @return 连接结果
     */
    boolean connectWebSocket(Long userId, String sessionId);

    /**
     * 断开WebSocket连接（更新离线状态）
     * 
     * @param userId 用户ID
     * @param sessionId WebSocket会话ID
     * @return 断开结果
     */
    boolean disconnectWebSocket(Long userId, String sessionId);

    /**
     * 发起语音通话
     * 
     * @param receiverId 接收者用户ID
     * @param callType 通话类型：1-语音通话 2-视频通话
     * @return 通话信息
     */
    Map<String, Object> initiateCall(Long receiverId, Integer callType);

    /**
     * 响应语音通话
     * 
     * @param callId 通话ID
     * @param action 响应动作：1-接听 2-拒绝 3-挂断
     * @return 响应结果
     */
    boolean respondCall(String callId, Integer action);
} 